package com.yystudy.rpc.proxy;

import com.yystudy.rpc.RpcApplication;

import java.lang.reflect.Proxy;

/**
 * 远程服务代理工厂（用于创建代理对象，使用 jdk 动态代理）
 */
public class ServiceProxyFactory {

    /**
     * 根据服务类获取代理对象
     *
     * @param serviceClass  服务类型
     * @param <T>   服务类型
     * @return   该服务的代理对象
     */
    public static <T> T getProxy(Class<T> serviceClass) {
        // 如果是 mock 模式，则返回 Mock 代理对象
        if (RpcApplication.getRpcConfig().isMock()) {
            return getMockProxy(serviceClass);
        }

        // 正常代理调用（Proxy.newProxyInstance()为 jdk 动态代理）
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new ServiceProxy());
    }


    /**
     * 根据服务类获取 Mock 代理对象
     *
     * @param serviceClass  服务类型
     * @param <T>
     * @return   该服务的代理对象
     */
    public static <T> T getMockProxy(Class<T> serviceClass) {
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new MockServiceProxy());
    }
}